#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif

#ifndef JETBYTE_TOOLS_OPAQUE_USER_DATA_INCLUDED__
#define JETBYTE_TOOLS_OPAQUE_USER_DATA_INCLUDED__

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools
///////////////////////////////////////////////////////////////////////////////

namespace OldDreamTools {

///////////////////////////////////////////////////////////////////////////////
// COpaqueUserData
///////////////////////////////////////////////////////////////////////////////

class COpaqueUserData
{
   public:

      void *GetUserPtr() const
      {
         //lint -e{50} Attempted to take the address of a non-lvalue
         return InterlockedExchangePointer(&(const_cast<void*>(m_pUserData)), m_pUserData);
      }

      void SetUserPtr(void *pData)
      {
         //lint -e{534} Ignoring return value of function
         //lint -e{522} Expected void type, assignment, increment or decrement
         InterlockedExchangePointer(&m_pUserData, pData);
      }

      unsigned long GetUserData() const
      {
         return reinterpret_cast<unsigned long>(GetUserPtr());
      }

      void SetUserData(unsigned long data)
      {
         SetUserPtr(reinterpret_cast<void*>(data));
      }

   protected :

      COpaqueUserData()
         : m_pUserData(0)
      {
      }

      ~COpaqueUserData()
      {
         m_pUserData = 0;
      }

   private :

      void *m_pUserData;

      // No copies do not implement
      COpaqueUserData(const COpaqueUserData &rhs);
      COpaqueUserData &operator=(const COpaqueUserData &rhs);
};

///////////////////////////////////////////////////////////////////////////////
// Namespace: OldDreamTools
///////////////////////////////////////////////////////////////////////////////

} // End of namespace OldDreamTools

///////////////////////////////////////////////////////////////////////////////
// Lint options
//
//lint -restore
//
///////////////////////////////////////////////////////////////////////////////

#endif // JETBYTE_TOOLS_OPAQUE_USER_DATA_INCLUDED__

///////////////////////////////////////////////////////////////////////////////
// End of file
///////////////////////////////////////////////////////////////////////////////

